Skip to main content

04 函数式编程

函数式编程

只关心定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。

特征

  • 函数不维护任何状态
  • 输入数据不能动,要返回新的数据集

优势

  • 没有状态就没有伤害
  • 并行执行无伤害
  • Copy-Paste 重构代码无伤害
  • 函数的执行没有顺序上的问题

**惰性求值:**表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值

**确定性:**函数无论在什么场景下,都会得到同样的结果

劣势

  • 数据复制比较严重
  • 完全纯函数式 Haskell
  • 容易写纯函数
  • 纯函数需要花更多的精力

函数式编程用到的技术

first class function(头等函数)

函数可以像变量一样被创建、修改,并当成变量一样传递、返回,或是在函数中嵌套函数。

tail recursion optimization(尾递归优化)

使用尾递归优化技术——每次递归时都会重用 stack,这样能够提升性能,需要语言或编译器的支持。

map & reduce

pipeline(管道)

将函数实例成一个一个的 action,然后将一组 action 放到一个数组或是列表中,再把数据传给这个 action list,数据就像一个 pipeline 一样顺序地被各个函数所操作,最终得到想要的结果。

recursing(递归)

简化代码

currying(柯里化)

将一个函数的多个参数分解成多个函数, 然后将函数多层封装起来,每层函数都返回一个函数去接收下一个参数,可以简化函数的多个参数。

higher order function(高阶函数)

函数当参数,把传入的函数做一个封装,然后返回这个封装函数。

函数式编程的思维方式

把程序的逻辑分成了函数,函数都是函数式的,

特点:

  • 函数之间没有共享的变量;
  • 函数间通过参数和返回值来传递数据;
  • 在函数里没有临时变量。

函数式语言的三套件

Map、Reduce 和 Filter